package com.awei.project.cos;

import com.awei.project.common.BaseResponse;
import com.awei.project.common.ErrorCode;
import com.awei.project.common.ResultUtils;
import com.awei.project.exception.BusinessException;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.Region;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.Upload;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.Random;
import java.util.Stack;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * cos的配置，和文件上传的方法
 *
 * @author 小维哥
 * @version 1.2
 */
@Component
public class COSoperate {
        // 1 初始化用户身份信息（secretId, secretKey）。
        static String key = "/upload_demo.pdf";    //上传到云上的路径
        static String bucketName = "24668-1327900726";
        static String region = "ap-nanjing";                //区域
        static COSCredentials cred;
        static COSClient cosClient ;
         TransferManager transferManager ;  //简化cos的文件传输和管理

        //进行cos的连接配置
        static {
                String SecretId = "AKIDGCrUzOm983qV1ObgSH1kJ2m9RaBcsyzt";
                String SecretKey = "oYBlJi1ETdnuvmS2Tp6EHC8zpbq7INQO";
                cred = new BasicCOSCredentials(SecretId, SecretKey);
                // 2 设置 bucket 的地域, COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224
                // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
                ClientConfig clientConfig = new ClientConfig(new Region(region));
                // 这里建议设置使用 https 协议
                // 从 5.6.54 版本开始，默认使用了 https
                clientConfig.setHttpProtocol(HttpProtocol.https);
                // 3 生成 cos 客户端。COSClient配置信息类
                cosClient = new COSClient(cred, clientConfig);
                //管理线程池，最多管理32个，高效

        }
        //方法有：1 对存储桶的创建和查询     2 对存储桶中的对象进行上传/查询/下载/删除操作,更多操作看官网

        /**
         * 上传对象到存储桶中，并返回线上访问地址
         *
         * @param multipartFile 接受的文件
         * @return 返回线上访问地址：https://<bucketName>.cos.<Region>.myqcloud.com/<key>
         */
        public  String upload(MultipartFile multipartFile) {
                if (multipartFile == null) {
                        throw new BusinessException(ErrorCode.NULL_ERROR);
                }
                ExecutorService threadPool = Executors.newFixedThreadPool(32);
                transferManager = new TransferManager(cosClient, threadPool);
                String originalFilename = multipartFile.getOriginalFilename();
                // 创建临时文件
                File tempFile = null;
                try {
                        tempFile= File.createTempFile("temp", null);
                        multipartFile.transferTo(tempFile);
                        // key：指定文件上传到 COS 上的路径，即对象键。例如对象键为 folder/picture.jpg，则表示将文件 picture.jpg 上传到 folder 路径下
                        //自己获取key,且随机在后面添加2位数字。/src/main/picture/liuyifei.jpg——>liuyifei.jpg
                        if(originalFilename==null){
                                throw new BusinessException(ErrorCode.OPERATION_ERROR,"文件名为空");
                        }
                        if(tempFile.length()<0){
                                throw new BusinessException(ErrorCode.OPERATION_ERROR,"文件内容为空");
                        }
                        String key = generateKey(originalFilename);
                        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, tempFile);
                        //文件上传
                        Upload upload = transferManager.upload(putObjectRequest);
                        upload.waitForUploadResult();
                        return "https://" + bucketName + ".cos." + region + ".myqcloud.com/" + key;
                } catch (Throwable e) {
                        throw new BusinessException(ErrorCode.OPERATION_ERROR, "上传文件失败");
                } finally {
                        // 关闭 COS 客户端以及清除临时文件
                        if(tempFile!=null&&!tempFile.delete()){
                                tempFile.deleteOnExit();
                        }
                        transferManager.shutdownNow();
                }
        }
        String  generateKey(String originalFilename){
                String[] split = originalFilename.split("/");
                int length = split.length;
                if (length <= 0) {
                        throw new BusinessException(ErrorCode.OPERATION_ERROR, "文件传输路径错误");
                }
                Random random = new Random();
                int i = random.nextInt(100);
                String s = split[length - 1];
                return s.substring(0, s.lastIndexOf(".")) + i + s.substring(s.lastIndexOf("."));
        }
}
